//: [Previous](@previous)
//Swift中常量和变量必须在使用前被声明。

//print(a)
//print(b)
//
//var a:Int
//var b:String

// 使用关键字 ==let== 来声明常量，使用关键字 ==var== 来声明变量

// swift中可以不使用 ';'
//变量
var str = "Hello, playground"
//常量
let sex = "男"

// 如果放在一行，应该添加分号
let name = "Jack"; var age = 18

// 常量和变量的声明可以显示指定类型，用':'隔开；也可以隐式不指定类型。
var personA:String = "Jim"
//不知道类型Swift会自动推断
var personB = "Bill"


//如果初始化时没有赋值，必须指定类型，用':'隔开
let personC:String
personC = "Jack Ma"



/*
 常量的值不要求在编译时期确定，但使用之前必须要赋值一次
 */

func retAge() -> Int {
	return 18
}
let age2: Int
age2 = retAge()
print(age2)




/*
 在Swift中标识符(比如常量名、变量名、函数名)几乎可以使用任何字符
 只要不能以数字开头即可
 只要不包含空白字符、制表符、箭头等特殊字符即可
 */
let 姓名 = "Jack Ma"
var 🍺 = "一杯啤酒"

print("\(姓名) 喝了 \(🍺)")
//Jack Ma 喝了 一杯啤酒


// Optional 可选变量
// 声明一个可选类型的时候要在类型后面加上？,如
var score:Int?


/*
//Optional其实就是一个enum类，里面有None和Some类型。nil就是Optional.None，非nil就是Optional.Some
对一个可选类型的值，需要进行拆包才不会报错。但是这个值是nil还是有some value，就不确定了；
？是一种判断后再拆包的语法糖
！是一种强制拆包的语法糖
?? 合并空值运算符,可以取默认值
*/

// 如果score 有赋值，输出其值，否则输出0

print(score ?? 0) // 输出 0
score = 60
print(score ?? 0) // 输入60



var s1:String?
// 我不知道s1 是否赋值，如果s1不会nil，输出其字符数，否则输出
// 对于可能输出为nil的值，应通过 合并空值运算符 ??给出一个可选值
print(s1?.count ?? "0") // 输出 0


var s2:String?
s2 = "ABC"
// 我确定s2 已经赋值了，可以使用！断言，输出s2的字符数
print(s2!.count)



// TODO: 待续

//: [Next](@next)
